// Name: AjaxFileUpload.AjaxFileUpload.Control.debug.js
// Assembly: AjaxControlToolkit
// Version: 3.5.7.1213
// FileVersion: 3.5.7.1213
Type.registerNamespace("Sys.Extended.UI.AjaxFileUpload");
Type.registerNamespace("AjaxFileUpload");
Sys.Extended.UI.AjaxFileUpload.Control = function (element) {
Sys.Extended.UI.AjaxFileUpload.Control.initializeBase(this, [element]);
this._allowedFileTypes = null;
this._contextKey = null;
this._postBackUrl = null;
this._mode = 0;
this._serverPollingSupport = false;
this._throbber = null;
this._maximumNumberOfFiles = 10;
this._allowedFileTypes = '';
this._chunkSize = 4096;
this._storeToAzure = false;
this._azureContainerName = '';
this._uploadUrl = 'AjaxFileUploadHandler.axd';
this._useHtml5Support = false;
this._elements = null;
this._processor = null;
this._filesInQueue = [];
this._isUploading = false;
this._currentFileId = null;
this._currentQueueIndex = 0;
this._canceled = false;
};
Sys.Extended.UI.AjaxFileUpload.Control.prototype = {
initialize: function () {
var utils = new Sys.Extended.UI.AjaxFileUpload.Utils(),
id = this.get_id(),
getElement = function (name) {
return document.getElementById(id + name);
},
elements = {
queueContainer: getElement('_QueueContainer'),
selectFileButton: getElement('_SelectFileButton'),
uploadOrCancelButton: getElement('_UploadOrCancelButton'),
fileStatusContainer: getElement('_FileStatusContainer'),
footer: getElement('_Footer')
};
this._useHtml5Support = utils.checkHtml5BrowserSupport() && this._mode != 2;
elements.progressBar = getElement('_ProgressBar');
elements.progressBarContainer = getElement('_ProgressBarContainer');
if (this._useHtml5Support) {
elements.inputFile = getElement('_Html5InputFile');
elements.dropZone = getElement('_Html5DropZone');
} else {
elements.inputFile = getElement('_InputFileElement');
}
this._elements = elements;
var processor = this._useHtml5Support
? new Sys.Extended.UI.AjaxFileUpload.ProcessorHtml5(this, elements)
: new Sys.Extended.UI.AjaxFileUpload.Processor(this, elements);
this.setDefaultElementsLayout(elements);
this.attachEvents(elements);
processor.initialize();
this._processor = processor;
Sys.Extended.UI.AjaxFileUpload.Control.callBaseMethod(this, "initialize");
},
dispose: function () {
Sys.Extended.UI.AjaxFileUpload.Control.callBaseMethod(this, "dispose");
},
setDefaultElementsLayout: function (elements) {
$common.setVisible(elements.inputFile, true);
$common.setVisible(elements.uploadOrCancelButton, false);
$common.setVisible(elements.fileStatusContainer, true);
elements.selectFileButton.innerHTML = Sys.Extended.UI.Resources.AjaxFileUpload_SelectFile;
elements.uploadOrCancelButton.innerHTML = Sys.Extended.UI.Resources.AjaxFileUpload_Upload;
this.setStatusMessage(Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload);
},
attachEvents: function (elements) {
this.onUploadOrCancelButtonClicked$delegate = Function.createDelegate(this, this.onUploadOrCancelButtonClickedHandler);
$addHandlers(elements.uploadOrCancelButton, { 'click': this.onUploadOrCancelButtonClicked$delegate });
},
onUploadOrCancelButtonClickedHandler: function (e) {
///
/// Event handler for click event on upload button. Upload button will act as a toggle driven by _isUploading field, for Upload and Cancel action.
/// if _isUploading set to true, it indicates that this button will act as Cancel, otherwise is Upload.
///
///
var files = this._filesInQueue;
if (!files.length) {
alert(Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload);
return;
}
var uploaded = 0;
for (var i = 0; i < files.length; i++) {
if (files[i]._isUploaded)
uploaded++;
}
if (uploaded == files.length) {
alert(Sys.Extended.UI.Resources.AjaxFileUpload_AllFilesUploaded);
return;
}
this.enableControls(this._isUploading);
this._isUploading = !this._isUploading;
if (this._isUploading) {
this._canceled = false;
var xhr = new XMLHttpRequest(),
self = this;
xhr.open("POST", '?contextKey=' + this._contextKey
+ "&start=1&queue=" + this._filesInQueue.length);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
self._processor.startUpload();
self.raiseUploadStart(Sys.Serialization.JavaScriptSerializer.deserialize(xhr.responseText));
} else {
self.raiseUploadError(xhr);
throw "Failed to starting upload.";
}
}
};
xhr.send(null);
} else {
this._canceled = true;
this._processor.cancelUpload();
for (var i = 0; i < files.length; i++) {
if (!files[i]._isUploaded) {
files[i]._isUploading = false;
}
}
}
},
enableControls: function (enable) {
///
/// If set to true, it will set control state to be enable (ready to upload),
/// otherwise control will disable and button state turns to Cancel button.
///
///
var btn = this._elements.uploadOrCancelButton;
$common.setText(btn, enable ? Sys.Extended.UI.Resources.AjaxFileUpload_Upload : Sys.Extended.UI.Resources.AjaxFileUpload_Cancel);
btn.setAttribute('class', enable ? 'ajax__fileupload_uploadbutton' : 'ajax_fileupload_cancelbutton');
$common.setVisible(this._elements.inputFile, enable);
if (this._useHtml5Support) {
this._elements.dropZone.disable = !enable;
this._elements.inputFile.disable = !enable;
}
},
done: function () {
///
/// Call this method when all files has been uploaded.
/// This method will reset states of control.
///
this._isUploading = false;
this.enableControls(true);
this.setStatusMessage(Sys.Extended.UI.Resources.AjaxFileUpload_AllFilesUploaded + " " + Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload);
$common.setVisible(this._elements.uploadOrCancelButton, false);
var xhr = new XMLHttpRequest(),
self = this,
currentFile = this._filesInQueue[this._currentQueueIndex - 1];
xhr.open("POST", '?contextKey=' + this._contextKey
+ "&complete=1&queue=" + this._filesInQueue.length
+ "&uploaded=" + (this._currentQueueIndex - (currentFile._isUploaded ? 0 : 1))
+ "&reason=" + (this._canceled ? "cancel" : "done"));
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
self.raiseUploadCompleteAll(Sys.Serialization.JavaScriptSerializer.deserialize(xhr.responseText));
} else {
self.raiseUploadError(xhr);
throw "Failed to completing upload.";
}
}
};
xhr.send(null);
this._filesInQueue = [];
this._currentQueueIndex = 0;
},
removeFileFromQueueHandler: function (e) {
///
/// Event handler of file item when user clicks remove button.
///
/// FileItem to be removed.
if (!e || e._isUploading)
return;
Array.remove(this._filesInQueue, e);
e.removeNodeFrom(this._elements.queueContainer);
if (!this._elements.queueContainer.hasChildNodes()) {
$common.setVisible(this._elements.queueContainer, false);
$common.setVisible(this._elements.uploadOrCancelButton, false);
}
this._showFilesCount();
},
addFileToQueue: function (item) {
///
/// Processor will call this method to add selected file to queue.
/// Will return true if file item successfully added, otherwise are false.
///
/// Value from input file element
var max = this.get_maximumNumberOfFiles();
if (max > 0 && this._filesInQueue.length >= max) {
alert(Sys.Extended.UI.Resources.AjaxFileUpload_MaxNumberOfFilesExceeded);
return false;
}
var fileItem = new Sys.Extended.UI.AjaxFileUpload.Item(this.get_id(), item,
Function.createDelegate(this, this.removeFileFromQueueHandler));
fileItem.appendNodeTo(this._elements.queueContainer);
fileItem.setStatus('pending', Sys.Extended.UI.Resources.AjaxFileUpload_Pending);
$common.setVisible(this._elements.queueContainer, true);
$common.setVisible(this._elements.uploadOrCancelButton, true);
this._filesInQueue.push(fileItem);
this._showFilesCount();
return true;
},
_showFilesCount: function () {
///
/// This will show number of files in queue or message to select file(s) when there is no file in queue.
///
var empty = (this._filesInQueue.length == 0);
this.setStatusMessage(empty
? Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload
: String.format(Sys.Extended.UI.Resources.AjaxFileUpload_FileInQueue, this._filesInQueue.length.toString()));
},
fileTypeIsValid: function (fileType) {
///
/// Check whether file type is allowed to be uploaded by checking it against AllowedFileTypes
property
///
///
///
if (!this._allowedFileTypes)
return true;
var allowedFileTypes = this._allowedFileTypes.split(',');
for (var i = 0; i < allowedFileTypes.length; i++) {
var ftype = allowedFileTypes[i];
if (fileType.toLocaleLowerCase() == ftype.toLocaleLowerCase())
return true;
}
return false;
},
confirmFileIsInvalid: function (fileItem) {
///
/// Send alert to user that file type is not acceptable. Processor uses this method after validation.
///
///
var utils = new Sys.Extended.UI.AjaxFileUpload.Utils();
alert(String.format(Sys.Extended.UI.Resources.AjaxFileUpload_WrongFileType, utils.getFileName(fileItem.value), fileItem.type));
},
doneAndUploadNextFile: function (fileItem) {
///
/// Mark fileItem as uploaded, and upload next file in queue.
///
/// Uploaded File
var xhr = new XMLHttpRequest(),
self = this;
xhr.open("POST", "?contextKey="+ this._contextKey +"&done=1&guid=" + fileItem._id, true);
xhr.onreadystatechange = function (e) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
self.raiseUploadComplete(Sys.Serialization.JavaScriptSerializer.deserialize(xhr.responseText));
self._processor.startUpload();
} else {
self.setFileStatus(fileItem, 'error', Sys.Extended.UI.Resources.AjaxFileUpload_error);
self.raiseUploadError(xhr);
throw "error raising upload complete event and start new upload";
}
}
};
xhr.send(null);
},
cancelUpload: function () {
var fileItem = this.getCurrentFileItem();
fileItem._isUploaded = false;
fileItem._isUploading = false;
this.setStatusMessage(Sys.Extended.UI.Resources.AjaxFileUpload_UploadCanceled);
for (var i = 0; i < this._filesInQueue.length; i++) {
var file = this._filesInQueue[i];
if (!file._isUploaded) {
this.setFileStatus(file, 'cancelled', Sys.Extended.UI.Resources.AjaxFileUpload_Canceled);
}
}
},
setAsUploading: function (fileItem) {
///
/// Set file item status is uploading.
///
///
fileItem._isUploading = true;
fileItem._isUploaded = false;
this._currentQueueIndex = Array.indexOf(this._filesInQueue, fileItem) + 1;
this.setFileStatus(fileItem, 'uploading', Sys.Extended.UI.Resources.AjaxFileUpload_Uploading);
this.setStatusMessage('Uploading ' + this._currentQueueIndex + ' of ' + this._filesInQueue.length + ' file(s)');
},
setFileStatus: function (fileItem, fileStatusText, text) {
///
/// Set file item status
///
/// file item or id
/// status text
/// status resource
if (typeof (fileItem) === "string")
fileItem = this.getFileItem(fileItem);
if (fileItem)
fileItem.setStatus(fileStatusText, text);
},
setStatusMessage: function (msg) {
///
/// Set status message.
///
///
this._elements.fileStatusContainer.innerHTML = msg;
},
setPercent: function (percent) {
///
/// Set percentage of progress bar.
///
/// percentage
var progressBar = this._elements.progressBar;
if (percent <= 0)
percent = "0";
else if (percent >= 100)
percent = "100";
progressBar.style.width = percent + '%';
$common.setText(progressBar, String.format(Sys.Extended.UI.Resources.AjaxFileUpload_UploadedPercentage, percent));
},
get_allowedFileTypes: function () {
return this._allowedFileTypes;
},
set_allowedFileTypes: function (value) {
this._allowedFileTypes = value;
},
get_contextKey: function () {
return this._contextKey;
},
set_contextKey: function (value) {
this._contextKey = value;
},
get_postBackUrl: function () {
return this._postBackUrl;
},
set_postBackUrl: function (value) {
this._postBackUrl = value;
},
get_mode: function () {
return this._mode;
},
set_mode: function (value) {
this._mode = value;
},
get_serverPollingSupport: function () {
return this._serverPollingSupport;
},
set_serverPollingSupport: function (value) {
this._serverPollingSupport = value;
},
get_throbber: function () {
return this._throbber;
},
set_throbber: function (value) {
this._throbber = value;
},
get_maximumNumberOfFiles: function () {
return this._maximumNumberOfFiles;
},
set_maximumNumberOfFiles: function (value) {
this._maximumNumberOfFiles = value;
},
get_chunkSize: function () {
return this._chunkSize;
},
set_chunkSize: function (value) {
this._chunkSize = value;
},
get_storeToAzure: function () {
return this._storeToAzure;
},
set_storeToAzure: function (value) {
this._storeToAzure = value;
},
get_azureContainerName: function () {
return this._azureContainerName;
},
set_azureContainerName: function (value) {
this._azureContainerName = value;
},
add_uploadStart: function (handler) {
this.get_events().addHandler("uploadStart", handler);
},
remove_uploadStart: function (handler) {
this.get_events().removeHandler("uploadStart", handler);
},
add_uploadComplete: function (handler) {
this.get_events().addHandler("uploadComplete", handler);
},
remove_uploadComplete: function (handler) {
this.get_events().removeHandler("uploadComplete", handler);
},
add_uploadCompleteAll: function (handler) {
this.get_events().addHandler("uploadCompleteAll", handler);
},
remove_uploadCompleteAll: function (handler) {
this.get_events().removeHandler("uploadCompleteAll", handler);
},
raiseUploadStart: function(e) {
var eh = this.get_events().getHandler("uploadStart");
if (eh) {
var eventArgs = new Sys.Extended.UI.AjaxFileUploadStartEventArgs(e.FilesInQueue, e.ServerArguments);
eh(this, eventArgs);
}
},
raiseUploadComplete: function (e) {
///
/// This method called once file is succesfully uploaded.
///
/// Uploaded file information
var fileItem = this.getCurrentFileItem();
if (!fileItem || !e || e.FileId !== fileItem._id)
throw "Invalid finalizing upload server response.";
this.setFileStatus(fileItem, 'uploaded', Sys.Extended.UI.Resources.AjaxFileUpload_Uploaded);
this.setStatusMessage('Uploaded ' + this._currentQueueIndex + ' of ' + this._filesInQueue.length + ' file(s)');
fileItem._isUploaded = true;
fileItem._isUploading = false;
fileItem.hide();
var eh = this.get_events().getHandler("uploadComplete");
if (eh) {
var fileIndex = Array.indexOf(this._filesInQueue, fileItem),
eventArgs = new Sys.Extended.UI.AjaxFileUploadEventArgs(e.FileId, "Success", e.FileName,
e.FileSize, e.ContentType,
e.PostedUrl, fileIndex,
this._filesInQueue.length);
eh(this, eventArgs);
}
},
raiseUploadCompleteAll: function(e) {
var eh = this.get_events().getHandler("uploadCompleteAll");
if (eh) {
var eventArgs = new Sys.Extended.UI.AjaxFileUploadCompleteAllEventArgs(e.FilesInQueue, e.FilesUploaded, e.Reason, e.ServerArguments);
eh(this, eventArgs);
}
},
add_uploadError: function (handler) {
this.get_events().addHandler("uploadError", handler);
},
remove_uploadError: function (handler) {
this.get_events().removeHandler("uploadError", handler);
},
raiseUploadError: function (e) {
var eh = this.get_events().getHandler("uploadError");
if (eh) {
eh(this, e);
}
this._canceled = false;
this._isUploading = false;
this.enableControls(true);
},
getCurrentFileItem: function () {
///
/// Get file item based on current file id.
///
///
return this.getFileItem(this._currentFileId);
},
getNextFile: function () {
///
/// Get next file in queue for upload.
///
/// Will returns null if all files has been uploaded.
if (!this._isUploading)
return null;
for (var i = 0; i < this._filesInQueue.length; i++) {
var file = this._filesInQueue[i];
if (!file._isUploaded) {
return file;
}
}
return null;
},
getFileItem: function (id) {
///
/// Get file item based on id.
///
/// id of file item to find.
/// File Item
for (var i = 0; i < this._filesInQueue.length; i++) {
var file = this._filesInQueue[i];
if (file._id === id) {
return file;
}
}
return null;
}
};
Sys.Extended.UI.AjaxFileUpload.Control.registerClass("Sys.Extended.UI.AjaxFileUpload.Control", Sys.Extended.UI.ControlBase);